package org.jeecg.modules.demo3.fly.controller;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.annotation.processing.SupportedSourceVersion;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.plaf.synth.SynthOptionPaneUI;

import net.sf.saxon.trans.SymbolicName;
import org.apache.commons.lang.StringUtils;
import org.hibernate.query.criteria.internal.expression.function.AggregationFunction;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.PermissionData;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.demo3.fly.TCP.ServerConfig;
import org.jeecg.modules.demo3.fly.entity.AxhkYwAgrplane;
import org.jeecg.modules.demo3.fly.entity.tcp.DistributionDataBean;
import org.jeecg.modules.demo3.fly.service.IAxhkYwAgrplaneService;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;

import org.jeecg.modules.demo3.fly.utils.FileInsert;
import org.jeecg.modules.demo3.fly.utils.FileRead;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;

 /**
 * @Description: 无人机管理表
 * @Author: jeecg-boot
 * @Date:   2021-01-28
 * @Version: V1.0
 */
@Api(tags="无人机管理表")
@RestController
@RequestMapping("/fly/axhkYwAgrplane")
@Slf4j
public class AxhkYwAgrplaneController extends JeecgController<AxhkYwAgrplane, IAxhkYwAgrplaneService> {
	@Autowired
	private IAxhkYwAgrplaneService axhkYwAgrplaneService;

	/**
	 * 分页列表查询
	 *
	 * @param axhkYwAgrplane
	 * @param pageNo
	 * @param pageSize
	 * @param req
	 * @return
	 */
	@AutoLog(value = "无人机管理表-分页列表查询")
	@ApiOperation(value="无人机管理表-分页列表查询", notes="无人机管理表-分页列表查询")
	@GetMapping(value = "/list")
	@PermissionData(pageComponent = "axhk/AxhkYwAgrplaneList")
	public Result<?> queryPageList(AxhkYwAgrplane axhkYwAgrplane,
								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
								   HttpServletRequest req) {
		QueryWrapper<AxhkYwAgrplane> queryWrapper = QueryGenerator.initQueryWrapper(axhkYwAgrplane, req.getParameterMap());
//		QueryGenerator.installAuthMplus(queryWrapper, LoginUser.class);
		Page<AxhkYwAgrplane> page = new Page<AxhkYwAgrplane>(pageNo, pageSize);
		IPage<AxhkYwAgrplane> pageList = axhkYwAgrplaneService.page(page, queryWrapper);
		return Result.OK(pageList);
	}

	/**
	 *   添加
	 *
	 * @param axhkYwAgrplane
	 * @return
	 */
	@AutoLog(value = "无人机管理表-添加")
	@ApiOperation(value="无人机管理表-添加", notes="无人机管理表-添加")
	@PostMapping(value = "/add")
	public Result<?> add(@RequestBody AxhkYwAgrplane axhkYwAgrplane) {
		axhkYwAgrplaneService.save(axhkYwAgrplane);
		return Result.OK("添加成功！");
	}

	/**
	 *  编辑
	 *
	 * @param axhkYwAgrplane
	 * @return
	 */
	@AutoLog(value = "无人机管理表-编辑")
	@ApiOperation(value="无人机管理表-编辑", notes="无人机管理表-编辑")
	@PutMapping(value = "/edit")
	public Result<?> edit(@RequestBody AxhkYwAgrplane axhkYwAgrplane) {
		axhkYwAgrplaneService.updateById(axhkYwAgrplane);
		return Result.OK("编辑成功!");
	}

	/**
	 *   通过id删除
	 *
	 * @param id
	 * @return
	 */
	@AutoLog(value = "无人机管理表-通过id删除")
	@ApiOperation(value="无人机管理表-通过id删除", notes="无人机管理表-通过id删除")
	@DeleteMapping(value = "/delete")
	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
		axhkYwAgrplaneService.removeById(id);
		return Result.OK("删除成功!");
	}

	/**
	 *  批量删除
	 *
	 * @param ids
	 * @return
	 */
	@AutoLog(value = "无人机管理表-批量删除")
	@ApiOperation(value="无人机管理表-批量删除", notes="无人机管理表-批量删除")
	@DeleteMapping(value = "/deleteBatch")
	public Result<?> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
		this.axhkYwAgrplaneService.removeByIds(Arrays.asList(ids.split(",")));
		return Result.OK("批量删除成功!");
	}

	/**
	 * 通过id查询
	 *
	 * @param id
	 * @return
	 */
	@AutoLog(value = "无人机管理表-通过id查询")
	@ApiOperation(value="无人机管理表-通过id查询", notes="无人机管理表-通过id查询")
	@GetMapping(value = "/queryById")
	public Result<?> queryById(@RequestParam(name="id",required=true) String id) {
		AxhkYwAgrplane axhkYwAgrplane = axhkYwAgrplaneService.getById(id);
		if(axhkYwAgrplane==null) {
			return Result.error("未找到对应数据");
		}
		return Result.OK(axhkYwAgrplane);
	}

    /**
    * 导出excel
    *
    * @param request
    * @param axhkYwAgrplane
    */
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, AxhkYwAgrplane axhkYwAgrplane) {
        return super.exportXls(request, axhkYwAgrplane, AxhkYwAgrplane.class, "无人机管理表");
    }

    /**
      * 通过excel导入数据
    *
    * @param request
    * @param response
    * @return
    */
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, AxhkYwAgrplane.class);
    }

	 //根据APP传输的 agrplane_id,user_id 修改无人机管理 APP用户跟用户组
	 @GetMapping("getByUserAgrplane")
	 public Result<?> getByUserAgrplane(String userId, String agrplaneId){
    	int i = axhkYwAgrplaneService.byUserAgrplane(userId,agrplaneId);
    	if(i>0){
    		return Result.OK("添加成功！");
		}
    	return Result.OK("添加失败！");
	 }

	 @GetMapping("getByTimes")
	 //根据无人机激活状态改变 激活时间
	 public Result<?> getByTimes(String num,int number){
    	int  i = axhkYwAgrplaneService.byUpdateTime(num,number);
    	if(i>0){
			return Result.OK("修改成功！");
		}
		 return Result.OK("修改失败！");
	 }

	 /*
	 * 列举所有的 设备
	 *
	 * */
	 @GetMapping("getByAllAgrplane")
	 public Result<?> getByAllAgrplane(){
		List<AxhkYwAgrplane> axhkYwAgrplaneList = axhkYwAgrplaneService.getAllByAxhkYwAgrplane();
		return Result.OK("获取成功",axhkYwAgrplaneList);
	 }

	 /*
	 * 获取数据解析 pc
	 * int serialNumber
	 * */
	 @GetMapping("getDistributionData")
	public Result<?> getDistributionData(Integer serialNumber){
		 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm"); // 使用系统当前时间为文件名
		 Date date = new Date();
		 String today = simpleDateFormat.format(date); //获取当前时间
		 String year = FileInsert.getCurrentYear(); //当前系统年
		 int month = FileInsert.getCurrentMonth(); //当前系统月
		 String time = today.substring(0, 10); //当前系统 年-月-日
		 int times = Integer.parseInt(today.substring(11, 13)); //当前系统 小时
		 FileRead fileRead = new FileRead();
		 DistributionDataBean distributionDataBean = null;
		 /*AxhkYwAgrplane axhkYwAgrplane = axhkYwAgrplaneService.getAxhkYwAgrplane(serialNumber);
		 int state = axhkYwAgrplane.getState();*/
		 if (null != serialNumber || 0 != serialNumber) {
				 String filePath = "C:\\OS\\fly\\" + serialNumber + "\\" + year + "\\" + month; //使用序列号 标识符做文档
				 File file = new File(filePath);
				 String[] fileNames = file.list(); //从文件夹下取出的所有文件数组
				 int minute = 0; //获取文件 分钟最大的文件
				 int minute2 = 0; //获取文件 分钟最大的文件
				 String pathName = null;
				 for (int i = 0; i < fileNames.length; i++) {//循环遍历所有文件名 找出所需要的文件
					 String fileName = fileNames[i].substring(0, fileNames[i].length()-10);//截取txt的文件名 yyyy-MM-dd
					 int fileName1 = Integer.parseInt(fileNames[i].substring(11, fileNames[i].length()-7));//截取txt的文件名  HH
					 int fileName2 = Integer.parseInt(fileNames[i].substring(14, fileNames[i].length()-4)); //截取txt的文件名 mm
					 // 循环所有的文件，首先应该先拿出跟今天日期相同的文件，其次查看小时是否相同，如果小时相同取分钟最大的文件
					 if(fileName.equals(time) && times == fileName1){//如果文件名日期跟系统日期相同,并且小时也相同
						 if(fileName2 > minute){
							 minute = fileName2; //拿到最大分钟
							 pathName = fileNames[i];
						 }
					 }
					 if(fileName.equals(time) && times > fileName1){ //如果文件名日期跟系统日期相同,并且小时不相同
						 if((times-1)==fileName1){
							 System.out.println("小时-1="+fileNames[i]);
							 if(fileName2 > minute2){
								 minute2 = fileName2; //拿到最大分钟
								 pathName = fileNames[i];
							 }
						 }
					 }
				 }
				 System.out.println("文件="+pathName+"最大分钟="+minute);
				 distributionDataBean = fileRead.getFileRead(serialNumber, month, year, pathName);
				 if (null != distributionDataBean) {
					 System.out.println(distributionDataBean.toString());
				 }
		 }else{
			 return Result.OKF("当前没有在线设备!");
		 }
		 return  Result.OK(distributionDataBean);
	 }

	 /*
	 *  pc 4g 设备在线
	 * */
	 @GetMapping("getDistributionDataBean")
	 public Result<?> getDistributionDataBean() {
		 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm"); // 使用系统当前时间为文件名
		 Date date = new Date();
		 String today = simpleDateFormat.format(date); //获取当前时间
		 String year = FileInsert.getCurrentYear(); //当前系统年
		 int month = FileInsert.getCurrentMonth(); //当前系统月
		 String time = today.substring(0, 10); //当前系统 年-月-日
		 int times = Integer.parseInt(today.substring(11, 13)); //当前系统 小时
		 FileRead fileRead = new FileRead();
		 DistributionDataBean distributionDataBean = null;
		 List<DistributionDataBean> distributionDataBeans = new ArrayList<>();
		 List<AxhkYwAgrplane> axhkYwAgrplaneList = axhkYwAgrplaneService.getAllByAxhkYwAgrplane();//遍历所有设备
		 List<Integer> listNumber = new ArrayList<>();//设备编号集合
		 for (int i = 0; i < axhkYwAgrplaneList.size(); i++) {
			 if (axhkYwAgrplaneList.get(i).getState() == 1) { //当设备在线
				 listNumber.add(axhkYwAgrplaneList.get(i).getSerialNumber()); //将在线设备序列号存入编号集合
			 }
		 }
		 if (listNumber.size() != 0) {
			 for (int j = 0; j < listNumber.size(); j++) {
				 int serialNumber = listNumber.get(j);
				 String filePath = "C:\\OS\\fly\\" + serialNumber + "\\" + year + "\\" + month; //使用序列号 标识符做文档
				 File file = new File(filePath);
				 String[] fileNames = file.list(); //从文件夹下取出的所有文件数组
				 int minute = 0; //获取文件 分钟最大的文件
				 int minute2 = 0; //获取文件 分钟最大的文件
				 String pathName = null;
				 for (int i = 0; i < fileNames.length; i++) {//循环遍历所有文件名 找出所需要的文件
					 String fileName = fileNames[i].substring(0, fileNames[i].length()-10);//截取txt的文件名 yyyy-MM-dd
					 int fileName1 = Integer.parseInt(fileNames[i].substring(11, fileNames[i].length()-7));//截取txt的文件名  HH
					 int fileName2 = Integer.parseInt(fileNames[i].substring(14, fileNames[i].length()-4)); //截取txt的文件名 mm
					 // 循环所有的文件，首先应该先拿出跟今天日期相同的文件，其次查看小时是否相同，如果小时相同取分钟最大的文件
					 if(fileName.equals(time) && times == fileName1){//如果文件名日期跟系统日期相同,并且小时也相同
						 if(fileName2 > minute){
							 minute = fileName2; //拿到最大分钟
							 pathName = fileNames[i];
						 }
					 }
					 if(fileName.equals(time) && times > fileName1){ //如果文件名日期跟系统日期相同,并且小时不相同
					 	if((times-1)==fileName1){
							System.out.println("小时-1="+fileNames[i]);
							if(fileName2 > minute2){
								minute2 = fileName2; //拿到最大分钟
								pathName = fileNames[i];
							}
						}
					 }
				 }
				 System.out.println("文件="+pathName+"最大分钟="+minute);
				 distributionDataBean = fileRead.getFileRead(serialNumber, month, year, pathName);
				 if (null != distributionDataBean) {
					 System.out.println(distributionDataBean.toString());
					 distributionDataBeans.add(distributionDataBean);
				 }
			 }
		 }else{
			 return Result.OKF("当前没有在线设备!");
		 }
		 System.out.println("对象集合长度="+distributionDataBeans.size());
		 return  Result.OK(distributionDataBeans);
	 }


}
